草庐IT

C++ 运算符 [] 魔法

全部标签

c++ - static_cast 与直接调用转换运算符?

考虑下面的类,作为一个简单的例子:#include#includeusingnamespacestd;classpoint{public:int_x{0};int_y{0};point(){}point(intx,inty):_x{x},_y{y}{}operatorstring()const{return'['+to_string(_x)+','+to_string(_y)+']';}friendostream&operator(p);//Option1os应该直接调用转换运算符,还是只调用static_cast并让它完成工作?这两行几乎会做完全相同的事情(即调用转换运算符),据我所

c++ - 返回类型取决于算术运算的顺序。这是正确的吗?

考虑以下代码片段:templatestructUn{Un(intp):n{p}{}Uoperator+(Uv)const{returnU{n+v.n};}intn{};};structR:Un{usingUn::Un;};structD:Un{usingUn::Un;D(Rv):Un{v.n}{}operatorR()const{returnn;}};用法如下:templatevoidwhat_type(Tt){std::cout::value::value输出是:typeR=1typeD=0typeR=0typeD=1这意味着如果在算术表达式中R类型出现在第一个,则整个表达式的类型为

c++ - 在 namespace 内的 lambda 中使用时找不到运算符重载

以下不编译(使用Clang5.0.0/gcc7.3,std:C++11):Clang中的错误信息:错误:二进制表达式的无效操作数(std::vector>和std::vector>)#include#includenamespacens{usingMyType=std::vector;}//namespacensusingns::MyType;MyType&operator+=(MyType&lhs,constMyType&rhs){for(inti=0;i;Funcoperator+(constFunc&lhs,constFunc&rhs){return[lhs,rhs](){aut

c++ - 未实现赋值运算符时调用构造函数

我正在VisualStudio2015中练习“字符串”类实现(C++)。我的类(class)有3个构造函数,但没有任何赋值运算符。String();String(char_c);String(constchar*_pc);在main()中,我故意使用赋值运算符来检查代码的行为。令我惊讶的是,它没有给出任何错误并使用构造函数String(constchar*_pc)为对象赋值。此外,在作用域的末尾,它调用了两次析构函数。在这种情况下,编译器在幕后做什么?为什么?这是我的代码:classString{private:intcapacity;char*start;public://Const

c++ - 如何在自定义对象的 << 运算符中添加自定义前缀

有没有办法在operator中添加自定义前缀对于我实现的对象?例如:classA{public:std::stringid;intcount;};std::ostream&operator如果我这样做:Aa;a.id="foo";a.count=1;std::cout输出将是:Id:fooCount:1我想做这样的事情:std::cout")要得到这样的输出:-Id:foo-Count:1==>Id:foo==>Count:1建议使用std::setfill和os.fill,但是std::setfill需要一个char作为参数,我需要一个自定义字符串。解决方案查看operator文档,

c++ - 圆括号运算符在 C++ 中独立做什么

在编写一些代码时,我有一个拼写错误导致了意外的编译结果,并导致我玩和测试编译器(VS2010)可接受的内容。我写了一个表达式,只包含括号运算符和一个数字(空括号会导致编译错误):(444);当我在Debug模式下运行代码时,该行似乎只是被程序跳过了。括号运算符单独出现时是什么意思? 最佳答案 如果我可以非正式地回答,(444);是一个声明。它可以写在语言允许您编写语句的任何地方,例如在函数中。它由一个表达式444组成,用圆括号括起来(这也是一个表达式)后跟语句终止符;。当然,任何按照as-if规则运行的理智编译器都会在编译期间将其删

c++ - C++ 运算符重载返回中的常量正确性

我有点困惑为什么我被告知要从C++中的二元运算符返回constfoo而不是foo。我一直在阅读BruceEckel的“ThinkinginC++”,在关于运算符重载的章节中,他说“通过使[重载二元运算符的]返回值成为常量,您声明只有一个常量可以为该返回值调用成员函数。这是const正确的,因为它可以防止您将潜在有值(value)的信息存储在最有可能丢失的对象中。但是,如果我有一个返回const的加号运算符和一个前缀增量运算符,则此代码无效:classInteger{inti;public:Integer(intii):i(ii){}Integer(Integer&);constInte

c++ - 如何覆盖运算符<<?

嘿,我已经覆盖了operator当我尝试在打印方法(const)中使用它时出现错误:覆盖的运算符:ostream&operator我想在哪里使用它:voidTreatmentHistory::TreatmentHistoryPrint()const{cout 最佳答案 您正在使用您的operator在const成员函数,因此m_treatmentDate是const(除非声明mutable)。你需要修复你的operator采取const参数:ostream&operator请注意,要使其正常工作GetDay(),GetMonth()

c++ - 编译时运算符

有人可以列出C++中可用的所有编译时运算符吗? 最佳答案 C++中有两个运算符,无论操作数如何,其结果始终可以在编译时确定,它们是sizeof[1]和::[2].当然,还有许多其他运算符的特殊用途可以在编译时解决,例如整数常量表达式标准中列出的那些。[1]与C++不同,C99具有可变长度数组类型。应用于VLA的sizeof无法在编译时确定。一些C++编译器提供VLA作为扩展。[2]即可以在编译时确定表达式的结果是什么实体。如果实体是对象,那么对象的值就是另一回事了。 关于c++-编译时运

c++ - delete[] 运算符是否处理通过指针返回的动态分配的内存?

我想知道delete[]运算符如何处理函数返回的指针,而不是在与delete语句相同的范围内进行动态分配。假设我有一个像这样的简单函数:int*getArray(){int*returnVal=newint[3];returnVal[0]=returnVal[1]=returnVal[2]=0;returnreturnVal;}现在,当我需要在代码中使用该数组时,我会执行以下操作:int*vals=getArray();//usevalues...delete[]vals;但是,我想知道,C++编译器如何知道分配的内存块有多大(以及要从vals中删除多少内存元素)?这是一种有效的技术,